home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / play / DES_Tracker2_00.lha / DTL / code / MODInfo.S < prev   
Text File  |  1993-12-17  |  29KB  |  1,237 lines

  1. ;;=======================================================================;;
  2. ;;                MODInfo.S  ->  Begun: Tue, Feb 9, 1993                 ;;
  3. ;;                    Last updated: Sat, Dec 18, 1993                    ;;
  4. ;;-----------------------------------------------------------------------;;
  5. ;; This is v2.0 of the Module Info Utility for destracker.library v3.0+  ;;
  6. ;;-----------------------------------------------------------------------;;
  7. ;;               Designed and written by Darren E. Schebek               ;;
  8. ;;                 Copyright ©1993 by Darren E. Schebek                  ;;
  9. ;;                          All rights reserved.                         ;;
  10. ;;-----------------------------------------------------------------------;;
  11. ;;                 This source code is NOT public domain                 ;;
  12. ;;=======================================================================;;
  13.  
  14.         INCLUDE    "dp:system.gs"    ;DevPac-specific global include thingy.
  15.         INCLUDE    "DTLib.I"    ;DES-Tracker include file.
  16.  
  17. ;---------------------------------------------------------------
  18. ; System equates...
  19.  
  20. _SYSBase    = 4        ;Pointer to exec library base.
  21.  
  22. ;---------------------------------------------------------------
  23. ; Control character equates used in text strings and in string parsing...
  24.  
  25. NULL    = $00    ;NULL
  26. TAB    = $09    ;TAB
  27. LF    = $0A    ;Linefeed
  28.  
  29. DQUOTE    = $22    ;Double quote
  30.  
  31. ;---------------------------------------------------------------
  32. ; Some custom macros of my own...
  33.  
  34. LOADLIB    MACRO
  35.     MOVE.L    _\1Base,A6
  36.     ENDM
  37.  
  38. SYS    MACRO
  39.     JSR    _LVO\1(A6)
  40.     ENDM
  41.  
  42.  
  43. BYTETAB    MACRO
  44. \1    EQU    SOFFSET
  45. SOFFSET    SET    SOFFSET+\2
  46.     ENDM
  47.  
  48. ;---------------------------------------------------------------
  49. ; Variables used by the MINFO program...
  50.  
  51.     STRUCTURE MINFO_VARS,0
  52.     UBYTE    LoadFlag
  53.     UBYTE    Dummy
  54.     APTR    MyTaskPtr        ;Points to my Task control structure.
  55.     APTR    MyFileInfoBlock        ;Ptr to a FileInfoBlock structure.
  56.     APTR    DosBase            ;Ptr to dos.library base.
  57.     APTR    DTBase            ;Ptr to destracker.library base.
  58.     LONG    SaveD0
  59.     BPTR    OutputHandle        ;Ptr to standard output handle.
  60.     BPTR    LockPointer
  61.     ULONG    PlayTime        ;Calc'ed play time for the song.
  62.     STRUCT    TimeScan,tsi_SIZE    ;TIMESCANINFO struct for CalcElapsedTime().
  63.     BYTETAB    FilenameString,128    ;Workspace for string handling.
  64.     BYTETAB    DecString,12        ;Holds decimal string of longword values.
  65.     BYTETAB    TimeString,16        ;Holds converted time string for play time.
  66.     LABEL    MINFO_SIZE        ;Equates to size of required var space.
  67.  
  68. ;---------------------------------------------------------------
  69. ; The beginning.  Start out by allocating space for my program variables,
  70. ; initialize the program, and then proceed to parse the command line
  71. ; arguments...
  72.  
  73. Main        Move.L    A0,A5        ;Cache argstring pointer in A3 for now.
  74.  
  75.         MoveQ    #10,D7        ;D7 holds exit code in case of error.
  76.  
  77. ; Allocate space for program variables...
  78.  
  79.         LOADLIB    SYS        ;Get SYS_Base in A6.
  80.         Move.L    #MINFO_SIZE,D0    ;Size of variable space I need.
  81.         Move.L    #MEMF_CLEAR,D1    ;Initialize everything to 0 for me.
  82.         SYS    AllocMem    ;Attempt to allocate variable space.
  83.         Tst.L    D0        ;Error?
  84.         Ble    ProgAbort    ;Yup, what a washout.
  85.         Move.L    D0,A4        ;Nobody's allowed to touch A4!
  86.  
  87.         Sub.L    A1,A1
  88.         SYS    FindTask
  89.         Move.L    D0,MyTaskPtr(A4)
  90.  
  91.         Move.L    #fib_SIZEOF,D0        ;Size of the structure.
  92.         Move.L    #MEMF_CLEAR,D1        ;Clear it out for me, please.
  93.         SYS    AllocMem        ;Attempt to allocate.
  94.         Move.L    D0,MyFileInfoBlock(A4)    ;Did it work?
  95.         Bne    .1            ;Yup, continue.
  96.  
  97.         Move.L    #InsuffMemText,D2    ;Nope, insufficient memory.
  98.         Bra    .PrintGo        ;Tell user and abort.
  99.  
  100. ; Open DOS Library...
  101.  
  102. .1        LOADLIB    SYS
  103.         Lea    DosName,A1
  104.         MoveQ    #0,D0
  105.         SYS    OpenLibrary
  106.         Move.L    D0,DosBase(A4)
  107.  
  108. ; Get handle of standard output...
  109.  
  110.         Move.L    D0,A6        ;Get output handle for text output.
  111.         SYS    Output
  112.         Move.L    D0,OutputHandle(A4)    ;Save ptr to std. output handle.
  113.  
  114. ; Open DES-Tracker library...
  115.  
  116. .OpenDT        LOADLIB    SYS
  117.         Lea    DTLName,A1    ;"destracker.library".
  118.         MoveQ    #3,D0        ;Must be version 3.0+ of library.
  119.         SYS    OpenLibrary    ;Attempt to open destracker.library.
  120.         Move.L    D0,DTBase(A4)    ;Store pointer to library base.
  121.         Bne    .2        ;If <>0 then open succeeded.
  122.  
  123.         Move.L    #NoLibOpenText,D2    ;Say "couldn't open lib..."
  124. .PrintGo    Bsr    PrintNicely        ;Abort with error.
  125.         Bra    Abort
  126.  
  127. ;-------------------------------
  128. ; Initialization complete.  Now check for command line argument...
  129.  
  130. .2        Bsr    GetFileSpec
  131.         Tst.L    D0
  132.         Beq    .IsQMark
  133.         Bpl    .HaveFileSpec    ;Load module and report statistics.
  134.         Bra    .NoFileSpec    ;Report stats on currently loaded mod.
  135.  
  136. .IsQMark    Move.L    #HelloText,D2    ;Say hello and don't report anything.
  137.         Bsr    PrintNicely    ;Nicely means you can pause text output.
  138.         Bra    .Done        ;And just leave.
  139.  
  140. ; Here, I have to load a specified song into the library and then report the
  141. ; results.  First, though, I have to make sure it's a legitimate filename spec...
  142.  
  143. .HaveFileSpec    Lea    FilenameString(A4),A0
  144.         Bsr    VerifyPath
  145.         Tst.L    D0
  146.         Beq    .LoadFile    ;Legitimate filespec, go load module.
  147.         Bpl    .NotFile
  148.  
  149.         Move.L    #NotFoundErr,D2
  150.         Bra    .PrintGo
  151.  
  152. .NotFile    Move.L    #NotFileText,D2
  153.         Bra    .PrintGo
  154.  
  155. .LoadFile    St    LoadFlag(A4)
  156.         Move.L    DTBase(A4),A6
  157.         Lea    FilenameString(A4),A0
  158.         SYS    LoadModule
  159.         Tst.L    D0
  160.         Bpl    .NoFileSpec    ;Now report on module just loaded.
  161.  
  162.         Bsr    ReportLibErr    ;Tell user why mod couldn't be loaded.
  163.         Bra    Abort
  164.  
  165. ; Here I have a module in memory that I must report statistics on, so I
  166. ; report statistics on it...
  167.  
  168. .NoFileSpec    Move.L    DTBase(A4),A5
  169.         BTst    #DF_MODULELOADED,dtl_Flags+1(A5)
  170.         Bne    .IsMod
  171.  
  172.         Move.L    #NoModuleText,D2
  173.         Bra    .PrintGo
  174.  
  175. .IsMod        
  176.  
  177. ; Calculate the play time for the song module...
  178.  
  179.         Lea    TimeScan(A4),A0
  180.         Move.B    dtl_StartPosition(A5),tsi_StartPos(A0)
  181.         Move.B    dtl_StartNoteIndex(A5),tsi_StartNote(A0)
  182.         Move.B    dtl_EndPosition(A5),tsi_EndPos(A0)
  183.         Move.B    dtl_EndNoteIndex(A5),tsi_EndNote(A0)
  184.         Move.B    dtl_DefaultTempo(A5),tsi_DefaultTempo(A0)
  185.         Move.B    dtl_FineTempo(A5),tsi_FineTempo(A0)
  186.  
  187.         MoveQ    #0,D0
  188.         Tst.B    dtl_TimingMode(A5)
  189.         Beq    .CET1
  190.         BSet    #TSIB_TIMINGMODE,D0
  191.  
  192. .CET1        BTst    #DF_TEMPOINT-8,dtl_Flags2(A5)
  193.         Beq    .CET2
  194.         BSet    #TSIB_TEMPOINTERP,D0
  195.  
  196. .CET2        Cmp.B    #1,dtl_DefIterations(A5)
  197.         Bls    .CET3
  198.  
  199. .DoConsecIter    BSet    #TSIB_MULTIPLEITERS,D0
  200.  
  201. .CET3        Move.B    D0,tsi_Flags(A0)
  202.  
  203.         Move.L    A6,-(Sp)
  204.  
  205.         Move.L    A5,A6
  206.         SYS    CalcElapsedTime
  207.  
  208.         MoveQ    #64,D0
  209.         MoveQ    #0,D1
  210.         MoveQ    #10,D2
  211.         SYS    CalcVolFadeTime
  212.         Move.L    D0,PlayTime(A4)
  213.  
  214.         Move.L    (Sp)+,A6
  215.  
  216.         Lea    TimeScan(A4),A0
  217.         MoveQ    #0,D1
  218.         Move.B    dtl_DefIterations(A5),D1
  219.         Cmp.B    #1,D1
  220.         Bhi    .Multi
  221.         Blo    .Multi
  222.  
  223. ; Store time for 1 iteration only...
  224.  
  225.         Move.L    tsi_FirstIterTime(A0),PlayTime(A4)
  226.         Bra    .DonePlayTime
  227.  
  228. ; Calculate time for multiple iterations...
  229.  
  230. .Multi        Move.L    PlayTime(A4),D0
  231.         Add.L    tsi_FirstIterTime(A0),D0
  232.         Move.L    tsi_ConsecIterTime(A0),D2
  233.         Bra    .CET4
  234.  
  235. .AddLoop    Add.L    D2,D0
  236.  
  237. .CET4        SubQ    #1,D1
  238.         Bgt    .AddLoop
  239.  
  240.         Move.L    D0,PlayTime(A4)
  241.  
  242.  
  243. .DonePlayTime    Move.L    #ModInfoForFile,D2
  244.         Bsr    PrintN2Text
  245.         Bne    AbortControlC
  246.  
  247.         Move.L    dtl_ModuleStatus+ms_Filename(A5),D2
  248.         Bsr    PrintNText
  249.         Bne    AbortControlC
  250.  
  251. ; Print title of song...
  252.  
  253.         Move.L    #TitleText,D2
  254.         Bsr    PrintN2Text
  255.         Bne    AbortControlC
  256.         Move.L    dtl_ModuleStatus+ms_Name(A5),D2
  257.         Bsr    PrintNText
  258.         Bne    AbortControlC
  259.  
  260. ; Print the play time for the song...
  261.  
  262.         Move.L    #PTimeText,D2
  263.         Bsr    PrintN2Text
  264.         Bne    AbortControlC
  265.         Move.L    PlayTime(A4),D0
  266.         Bsr    BinToTime
  267.         Lea    TimeString(A4),A0
  268.         Move.L    A0,D2
  269.         Bsr    PrintNText
  270.         Bne    AbortControlC
  271.  
  272. ; Print length of the file...
  273.  
  274.         Move.L    #FLengthText,D2
  275.         Bsr    PrintN2Text
  276.         Bne    AbortControlC
  277.         Move.L    dtl_ModuleStatus+ms_Length(A5),D0
  278.         Bsr    BinToDec
  279.         Lea    DecString(A4),A0
  280.         Bsr    StripLeadingZeros
  281.         Move.L    A0,D2
  282.         Bsr    PrintNText
  283.         Bne    AbortControlC
  284.  
  285. ; Print format of the module file...
  286.  
  287.         Move.L    #FormatText,D2
  288.         Bsr    PrintN2Text
  289.         Bne    AbortControlC
  290.         Move.L    #STFormat,D2
  291.         Cmp.B    #MF_SOUNDTRACKER,dtl_ModuleStatus+ms_Format(A5)
  292.         Beq    .RS1
  293.         Move.L    #NTFormat,D2
  294.         Cmp.B    #MF_NOISETRACKER,dtl_ModuleStatus+ms_Format(A5)
  295.         Beq    .RS1
  296.         Move.L    #DTFormat,D2
  297. .RS1        Bsr    PrintNText
  298.         Bne    AbortControlC
  299.  
  300. ; Say whether file has a PSC0 construct or not...
  301.  
  302.         Move.L    #HasPSC0Text,D2
  303.         Bsr    PrintN2Text
  304.         Bne    AbortControlC
  305.         Move.L    #YesText,D2
  306.         BTst    #DF_HASPSC0-8,dtl_Flags2(A5)
  307.         Bne    .RS2
  308.         Move.L    #NoText,D2
  309. .RS2        Bsr    PrintNText
  310.         Bne    AbortControlC
  311.  
  312. ; Indicate base timing...
  313.  
  314.         Move.L    #BaseTimingText,D2
  315.         Bsr    PrintN2Text
  316.         Bne    AbortControlC
  317.  
  318.         Move.L    #UnknownText,D2
  319.         BTst    #DF_HASPSC0-8,dtl_Flags2(A5)
  320.         Beq    .RS3
  321.  
  322.         Move.L    #NTSCText,D2
  323.         Tst.B    dtl_TimingMode(A5)
  324.         Beq    .RS3
  325.         Move.L    #PALText,D2
  326. .RS3        Bsr    PrintNText
  327.         Bne    AbortControlC
  328.  
  329. ; Report tempo interpretation...
  330.  
  331.         Move.L    #TempoIntText,D2
  332.         Bsr    PrintN2Text
  333.         Bne    AbortControlC
  334.         Move.L    #StandardText,D2
  335.         BTst    #DF_TEMPOINT-8,dtl_Flags2(A5)
  336.         Bne    .RS4
  337.         Move.L    #BPMText,D2
  338. .RS4        Bsr    PrintNText
  339.         Bne    AbortControlC
  340.  
  341. ; Report default tempo...
  342.  
  343.         Move.L    #DefTempoText,D2
  344.         Bsr    PrintN2Text
  345.         Bne    AbortControlC
  346.         MoveQ    #0,D0
  347.         Move.B    dtl_DefaultTempo(A5),D0
  348.         Bsr    BinToDec
  349.         Lea    DecString(A4),A0
  350.         Bsr    StripLeadingZeros
  351.         Move.L    A0,D2
  352.         Bsr    PrintNText
  353.         Bne    AbortControlC
  354.  
  355. ; Report default fine tempo...
  356.  
  357.         Move.L    #DefFTempoText,D2
  358.         Bsr    PrintN2Text
  359.         Bne    AbortControlC
  360.         MoveQ    #0,D0
  361.         Move.B    dtl_FineTempo(A5),D0
  362.         Bpl    .RS8
  363.  
  364.         Neg.B    D0
  365.         Move.L    D0,-(Sp)
  366.         Move.L    #MinusText,D2
  367.         MoveQ    #1,D3
  368.         Bsr    PrintCLI
  369.         Bne    AbortControlC
  370.         Move.L    (Sp)+,D0
  371.  
  372. .RS8        Bsr    BinToDec
  373.         Lea    DecString(A4),A0
  374.         Bsr    StripLeadingZeros
  375.         Move.L    A0,D2
  376.         Bsr    PrintNText
  377.         Bne    AbortControlC
  378.  
  379. ; Report Iterations...
  380.  
  381.         Move.L    #IterationsText,D2
  382.         Bsr    PrintN2Text
  383.         Bne    AbortControlC
  384.         MoveQ    #0,D0
  385.         Move.L    #InfiniteText,D2
  386.         Move.B    dtl_DefIterations(A5),D0
  387.         Beq    .RS5
  388.         Bsr    BinToDec
  389.         Lea    DecString(A4),A0
  390.         Bsr    StripLeadingZeros
  391.         Move.L    A0,D2
  392. .RS5        Bsr    PrintNText
  393.         Bne    AbortControlC
  394.  
  395. ; Report number of patterns...
  396.  
  397.         Move.L    #NumPattsText,D2
  398.         Bsr    PrintN2Text
  399.         Bne    AbortControlC
  400.         MoveQ    #0,D0
  401.         Move.W    dtl_ModuleStatus+ms_NumPatterns(A5),D0
  402.         Bsr    BinToDec
  403.         Lea    DecString(A4),A0
  404.         Bsr    StripLeadingZeros
  405.         Move.L    A0,D2
  406.         Bsr    PrintNText
  407.         Bne    AbortControlC
  408.  
  409. ; Report number of positions...
  410.  
  411.         Move.L    #NumPosText,D2
  412.         Bsr    PrintN2Text
  413.         Bne    AbortControlC
  414.         MoveQ    #0,D0
  415.         Move.W    dtl_ModuleStatus+ms_NumPositions(A5),D0
  416.         Bsr    BinToDec
  417.         Lea    DecString(A4),A0
  418.         Bsr    StripLeadingZeros
  419.         Move.L    A0,D2
  420.         Bsr    PrintNText
  421.         Bne    AbortControlC
  422.  
  423. ; Report number of instruments...
  424.  
  425.         Move.L    #NumInstsText,D2
  426.         Bsr    PrintN2Text
  427.         Bne    AbortControlC
  428.         Lea    dtl_ModuleStatus+ms_Instruments(A5),A0
  429.         MoveQ    #0,D0
  430. .RS6        Tst.L    (A0)
  431.         Beq    .RS7
  432.         Move.L    (A0),A0
  433.         AddQ    #1,D0
  434.         Bra    .RS6
  435. .RS7        Move.L    D0,SaveD0(A4)
  436.         Bsr    BinToDec
  437.         Lea    DecString(A4),A0
  438.         Bsr    StripLeadingZeros
  439.         Move.L    A0,D2
  440.         Bsr    PrintNText
  441.         Bne    AbortControlC
  442.         Move.L    SaveD0(A4),D0
  443.  
  444. ; Now report instrument data...
  445.  
  446.         Tst.B    D0        ;Any instruments to report?
  447.         Beq    .Done        ;Nope.
  448.  
  449.         Move.L    #InstDataText,D2
  450.         Bsr    PrintNText
  451.         Bne    AbortControlC
  452.  
  453.         Move.L    dtl_ModuleStatus+ms_InstInfoBlocks(A5),A3
  454.         MoveQ    #1,D4
  455.         MoveQ    #31-1,D5
  456.         
  457. .ILoop        Tst.W    22(A3)
  458.         Bne    .GoodInst
  459.  
  460.         Tst.B    (A3)
  461.         Beq    .NextInstrument
  462.  
  463. .GoodInst    MoveQ    #0,D0
  464.         Move.L    D4,D0
  465.         MoveQ    #4,D1
  466.         Bsr    PrintDecRJust
  467.         Bne    AbortControlC
  468.  
  469.         MoveQ    #4,D0
  470.         Bsr    PrintNSpaces
  471.         Bne    AbortControlC
  472.  
  473.         Move.L    A3,D2
  474.         MoveQ    #22,D0        ;Don't print more than 22 characters.
  475.         Bsr    PrintTextMax
  476.         Bne    AbortControlC
  477.         Move.W    D0,D1
  478.         MoveQ    #24,D0
  479.         Sub.W    D1,D0
  480.         Bsr    PrintNSpaces
  481.         Bne    AbortControlC
  482.  
  483.         Move.L    #0,D0
  484.         Move.W    22(A3),D0
  485.         Bne    .IsUsed
  486.  
  487.         Move.L    #UnusedText,D2
  488.         Bsr    PrintNicely
  489.         Bne    AbortControlC
  490.         Bra    .NextInstrument
  491.  
  492. .IsUsed        Add.L    D0,D0
  493.         MoveQ    #7,D1
  494.         Bsr    PrintDecRJust
  495.         Bne    AbortControlC
  496.  
  497.         MoveQ    #3,D0
  498.         Bsr    PrintNSpaces
  499.         Bne    AbortControlC
  500.  
  501.         MoveQ    #0,D0
  502.         Move.W    26(A3),D0
  503.         Add.L    D0,D0
  504.         MoveQ    #7,D1
  505.         Bsr    PrintDecRJust
  506.         Bne    AbortControlC
  507.  
  508.         MoveQ    #2,D0
  509.         Bsr    PrintNSpaces
  510.         Bne    AbortControlC
  511.  
  512.         MoveQ    #0,D0
  513.         Move.W    28(A3),D0
  514.         Add.L    D0,D0
  515.         MoveQ    #7,D1
  516.         Bsr    PrintDecRJust
  517.         Bne    AbortControlC
  518.  
  519.         MoveQ    #4,D0
  520.         Bsr    PrintNSpaces
  521.         Bne    AbortControlC
  522.  
  523.         MoveQ    #0,D0
  524.         Move.B    25(A3),D0
  525.         MoveQ    #2,D1
  526.         Bsr    PrintDecRJust
  527.         Bne    AbortControlC
  528.  
  529.         Move.L    #LineFeed,D2
  530.         MoveQ    #1,D3
  531.         Bsr    PrintCLI
  532.  
  533. .NextInstrument    AddQ.W    #1,D4
  534.         Lea    30(A3),A3
  535.         DBra    D5,.ILoop
  536.  
  537. .InstsDone    Move.L    #LineFeed,D2
  538.         MoveQ    #1,D3
  539.         Bsr    PrintCLI
  540.  
  541.         Bsr    PrintSampleTexts
  542.  
  543. .Done        Move.L    DTBase(A4),A6
  544.         Tst.B    LoadFlag(A4)
  545.         Beq    .Go
  546.  
  547.         SYS    UnloadModule    ;Unload mod if I had to load it myself.
  548.  
  549. .Go        MoveQ    #0,D7
  550.  
  551. ;-------------------------------
  552. ; Deallocate everything and leave...
  553.  
  554. Abort        LOADLIB    SYS            ;Get SYS_Base.
  555.         Move.L    MyFileInfoBlock(A4),D0
  556.         Beq    .1            ;Wasn't allocated.
  557.         Move.L    D0,A1
  558.         Move.L    #fib_SIZEOF,D0
  559.         SYS    FreeMem
  560.  
  561. .1        Move.L    DTBase(A4),D0        ;DES-Tracker lib base ptr.
  562.         Beq    .4            ;It didn't open.
  563.         Move.L    D0,A1            ;It is open.
  564.         SYS    CloseLibrary        ;Close it.
  565.  
  566. .4        Move.L    DosBase(A4),D0
  567.         Beq    .5
  568.         Move.L    D0,A1
  569.         SYS    CloseLibrary
  570.  
  571. .5        Move.L    A4,A1            ;Release program variable space.
  572.         Move.L    #MINFO_SIZE,D0        ;Size of variable space.
  573.         SYS    FreeMem            ;Free it.
  574.  
  575. Leave        Move.L    D7,D0            ;Return exit code in D0.
  576.         Rts
  577.  
  578. ProgAbort    MoveQ    #10,D7            ;Error exit code in D7.
  579.         Bra    Leave            ;Abort with error.
  580.  
  581. ;---------------------------------------------------------------
  582.  
  583. AbortControlC    Move.L    #UserAbortText,D2
  584.         Bsr    PrintNText
  585.         Bra    Abort
  586.  
  587. UserAbortText    Dc.B    LF,LF,"*** User abort. ***",LF,LF,0
  588.         Even
  589.  
  590. ;---------------------------------------------------------------
  591. ; Determines if a given sample is a valid sampletext.
  592. ;
  593. ;  Input: A0 = Pointer to an INSTSTATUS structure.
  594. ;
  595. ; Output: D0 = non-zero if instrument is NOT a valid sampletext, zero if it
  596. ;           IS a valid sampletext.
  597. ;
  598.  
  599. CheckIfSampleText
  600.         MoveM.L    D1-D4/A0-A3,-(Sp)
  601.  
  602.         Move.L    is_Address(A0),A1
  603.         Move.L    is_Length(A0),D0
  604.         MoveQ    #-1,D2
  605.  
  606.         Cmp.L    #8,D0
  607.         Blt    .NoGood        ;8 bytes or less - can't be a sampletext.
  608.  
  609.         SubQ.L    #4,D0
  610.         AddQ.W    #4,A1
  611.  
  612. ; Valid range for SampleText chars: $20-$7F inclusive, $09, $0A, $0D
  613. ; All other values invalidate instrument data as a SampleText...
  614.  
  615. .1        Move.B    (A1)+,D1
  616.         Bmi    .NoGood
  617.         Beq    .2
  618.  
  619.         Cmp.B    #$09,D1
  620.         Beq    .2
  621.         Cmp.B    #$0A,D1
  622.         Beq    .2
  623.         Cmp.B    #$0D,D1
  624.         Beq    .2
  625.         Cmp.B    #$20,D1
  626.         Blt    .NoGood
  627.  
  628. .2        SubQ.L    #1,D0
  629.         Bne    .1
  630.  
  631.         MoveQ    #0,D2    ;It's a sampletext.
  632.  
  633. .NoGood        Move.L    D2,D0
  634.  
  635.         MoveM.L    (Sp)+,D1-D4/A0-A3
  636.         Rts
  637.  
  638. ;---------------------------------------------------------------
  639.  
  640. PrintSampleTexts
  641.  
  642.         Move.L    dtl_ModuleStatus+ms_Instruments(A5),A3
  643.         Bra    .NextInst
  644.  
  645. .InstLoop    Move.L    D0,A3
  646.  
  647.         Move.L    D0,A0
  648.         Bsr    CheckIfSampleText
  649.         Tst.W    D0
  650.         Bne    .NextInst
  651.  
  652.         Move.L    #PSampleText,D2
  653.         Bsr    PrintN2Text
  654.  
  655.         Move.L    is_Name(A3),D2
  656.         Bsr    PrintN2Text
  657.  
  658.         Move.l    #CloseQText,D2
  659.         Bsr    PrintN2Text
  660.  
  661.         Move.L    is_Address(A3),A2
  662.         Move.L    is_Length(A3),D3
  663.  
  664.         AddQ.W    #4,A2
  665.         SubQ.L    #4,D3
  666.  
  667. .1        Tst.B    (A2)
  668.         Bne    .2
  669.         AddQ.W    #1,A2
  670.         SubQ.L    #1,D3
  671.         Bra    .1
  672.  
  673. .2        Move.L    A2,D2
  674.         Bsr    PrintNicely
  675.  
  676. .3        SubQ.L    #1,D3
  677.         Ble    .DoLF
  678.         Tst.B    (A2)+
  679.         Bne    .3
  680.         Bra    .1    ;Hit a NULL, skip it and print rest of sampletext.
  681.  
  682. .DoLF        Move.L    #LFd,D2
  683.         MoveQ    #1,D3
  684.         Bsr    PrintCLI
  685.  
  686. .NextInst    Move.L    (A3),D0
  687.         Bne    .InstLoop
  688.  
  689. .Done        Rts
  690.  
  691. LFd        Dc.B    LF,LF,0
  692. PSampleText    Dc.B    'Showing Sample Text: "',NULL
  693. CloseQText    Dc.B    '"...',LF,LF,NULL
  694.  
  695.         Even
  696.  
  697. ;---------------------------------------------------------------
  698.  
  699. PrintDecRJust    MoveM.L    D0-D1/A0-A3,-(Sp)
  700.  
  701.         Bsr    BinToDec
  702.         Lea    DecString(A4),A0
  703.         Bsr    StripLeadingZeros
  704.         Move.L    A0,A1
  705.         MoveQ    #-1,D0
  706. .1        AddQ    #1,D0
  707.         Tst.B    (A1)+
  708.         Bne    .1
  709.         Sub.W    D0,D1
  710.         Move.W    D1,D0
  711.         Bsr    PrintNSpaces
  712.         Bne    .AbortControlC
  713.  
  714.         Move.L    A0,D2
  715.         Bsr    PrintN2Text
  716.         Bne    .AbortControlC
  717.  
  718. .Done        MoveM.L    (Sp)+,D0-D1/A0-A3
  719.         Rts
  720.  
  721. .AbortControlC    MoveQ    #-1,D0
  722.         Bra    .Done
  723.  
  724. ;---------------------------------------------------------------
  725. ; Input: D0 = Number of space characters to output (up to 31).
  726. ;
  727. PrintNSpaces    MoveM.L    D2-D3/A0-A3,-(Sp)
  728.         Lea    Spaces(PC),A0
  729.         Move.L    A0,D2
  730.         And.L    #$1F,D0
  731.         Beq    .Done
  732.         Move.L    D0,D3
  733.         Bsr    PrintCLI
  734.  
  735. .Done        MoveM.L    (Sp)+,D2-D3/A0-A3
  736.         Rts
  737.  
  738. Spaces        Dc.B    "                                "
  739.  
  740. ;---------------------------------------------------------------
  741.  
  742. StripLeadingZeros
  743.         Tst.B    1(A0)
  744.         Beq    .Done
  745.         Cmp.B    #"0",(A0)
  746.         Bne    .Done
  747.         Move.B    #" ",(A0)+
  748.         Bra    StripLeadingZeros
  749.  
  750. .Done        Rts
  751.  
  752. ;---------------------------------------------------------------
  753. ; VerifyPath routine.  Takes a string which might be either a pathname or a
  754. ; filespec, tries to get a lock on it, and determines whether the string
  755. ; is a pathname, filespec, or garbage.  I save a lot of registers in this
  756. ; routine because I just don't trust AmigaDOS (who would?).
  757. ;
  758. ;   Input: A0 = Pathname or filespec string (NULL-Terminated).
  759. ;
  760. ;  Output: D0 =  0 if string is a filespec.
  761. ;        >0 if string is a pathname.
  762. ;        <0 if string is bloody nonsense.
  763. ;
  764. ; Trashes: Nothing.
  765. ;
  766. VerifyPath    MoveM.L    D1-D7/A0-A3/A5/A6,-(Sp)    ;Speed's not important here. Play it safe.
  767.  
  768.         MoveQ    #-1,D6            ;Assume user will type nonsense. :)
  769.  
  770.         Move.L    DosBase(A4),A6        ;Get DOS_Base.
  771.         Move.L    A0,D1            ;Ptr to string in D1.
  772.         MoveQ    #-2,D2            ;Read only mode for lock.
  773.         SYS    Lock            ;Attempt to get a lock.
  774.         Move.L    D0,LockPointer(A4)    ;Save ptr to the lock.
  775.         Beq    .Leave2            ;Couldn't get a lock. Error.
  776.  
  777.         Move.L    D0,D7            ;Cache lock pointer in D7.
  778.         Move.L    D7,D1            ;Put it back in D1.
  779.         Move.L    MyFileInfoBlock(A4),A0    ;Get ptr to FileInfoBlock.
  780.         Move.L    A0,D2            ;DOS wants it in D2.
  781.         SYS    Examine            ;Fill out file info block.
  782.         Tst.L    D0            ;Was the path/file found?
  783.         Beq    .Leave            ;Apparently not.
  784.  
  785.         Move.L    MyFileInfoBlock(A4),A0    ;Yes, get file info block again.
  786.         Tst.W    fib_DirEntryType(A0)    ;Check dir entry type.
  787.         Bmi    .IsFile            ;Negative means it's a file.
  788.  
  789.         AddQ.L    #1,D6            ;It's a path, inc D6.
  790.  
  791. .IsFile        AddQ.L    #1,D6            ;It's a file, inc D6.
  792.  
  793. .Leave        Move.L    LockPointer(A4),D1
  794.         SYS    UnLock
  795.  
  796. .Leave2        Move.L    D6,D0            ;Return status in D0.
  797.         MoveM.L    (Sp)+,D1-D7/A0-A3/A5/A6    ;Restore regs.
  798.         Rts                ;And leave.
  799.  
  800. ;---------------------------------------------------------------
  801. ; GetFileSpec routine.  Extracts a file specification from the command line
  802. ; args.  Stores the extracted filespec in FilenameString[].
  803. ;
  804. ;   Input: A5 = pointer to command line argstring.
  805. ;
  806. ;  Output: FilenameString[] holds the extracted filespec.
  807. ;       A5 pts to new current position in argstring.
  808. ;       D0 = -1 if no filespec was specified in the argstring.
  809. ;         0 if argument begins with "?".
  810. ;        +1 if FilenameString[] holds a valid string.
  811. ;
  812. ; Trashes: A0
  813. ;
  814.  
  815. GetFileSpec    Lea FilenameString(A4),A0    ;A0 = ptr to dest string buffer.
  816.  
  817. .Skip        Move.B    (A5),D0        ;Get char from argstring.
  818.         Cmp.B    #DQUOTE,D0    ;Is it a double quote?
  819.         Beq.S    .DoQuote    ;Yup, do special quote handling.
  820.         Cmp.B    #"?",D0        ;Is it a ?
  821.         Beq    .IsQMark    ;Yup, Leave with return code of 0.
  822.         Cmp.B    #" ",D0        ;Is it a space character?
  823.         Bgt    .Copy        ;No, ASCII value is greater than space char.
  824.         Cmp.B    #TAB,D0        ;Is it a tab?
  825.         Beq    .Skip        ;Yup, ignore it.
  826.         Cmp.B    #LF,D0        ;Have I reached the end of the argstring?
  827.         Beq    .NoFileSpec    ;Yup, no filespec was specified.
  828.  
  829.         AddQ    #1,A5        ;No, so ignore char and get another.
  830.         Bra    .Skip
  831.  
  832. .DoQuote    AddQ    #1,A5        ;Skip past the double quote character.
  833.         Move.B    (A5),D0        ;Get char from argstring.
  834.         Cmp.B    #LF,D0        ;Reached EOL yet?
  835.         Beq    .Done        ;Yup, no close quote, but that's OK.
  836.         Cmp.B    #DQUOTE,D0    ;Is it a (close) quote?
  837.         Beq    .EndQuote    ;Yup, fix up argstring ptr and leave.
  838.         Move.B    D0,(A0)+    ;Nope, extract this character.
  839.         Bra    .DoQuote    ;And go get another.
  840.  
  841. .EndQuote    AddQ    #1,A5        ;Skip past the close quote.
  842.         Bra    .Done        ;And leave.
  843.  
  844. .Copy        Move.B    (A5)+,(A0)+    ;Copy a character from argstring into buffer.
  845.         Cmp.B    #" ",(A5)    ;Is next char a space?
  846.         Beq.S    .Done        ;Yup, NULL-terminate buffer and leave.
  847.         Cmp.B    #TAB,(A5)    ;Is next char a tab?
  848.         Beq.S    .Done        ;Yup, all done.
  849.         Cmp.B    #LF,(A5)    ;Nope, reached EOL yet?
  850.         Bne.S    .Copy        ;Nope, go copy next character.
  851.  
  852. .Done        Clr.B    (A0)        ;NULL-terminate string in buffer.
  853.         MoveQ    #1,D0        ;Indicate valid string in buffer.
  854.  
  855. .Leave        Rts            ;And leave.
  856.  
  857. .IsQMark    MoveQ    #0,D0        ;Indicate argument was "?"
  858.         Bra    .Leave
  859.  
  860. .NoFileSpec    MoveQ    #-1,D0        ;Indicate no filespec was given.
  861.         Bra    .Leave        ;and leave.
  862.  
  863. ;---------------------------------------------------------------
  864. ; PrintCLI routine.  Prints a text string to the standard output.
  865. ;
  866. ;   Input: D2 = Pointer to the text string to print (NOT NULL-terminated).
  867. ;       D3 = Length of the text string.
  868. ;
  869. ;  Output: Nothing.
  870. ;
  871. ; Trashes: D0,D1,D2,D3,A0,A1,A2
  872. ;
  873.  
  874. PrintCLI    MoveM.L    A0-A6,-(Sp)
  875.         Move.L    OutputHandle(A4),D1
  876.         Move.L    DosBase(A4),A6
  877.         SYS    Write
  878.  
  879.  
  880. ; Before returning, check to see if CTRL-C has been pressed...
  881.  
  882.         LOADLIB    SYS
  883.         MoveQ    #0,D0
  884.         MoveQ    #0,D1
  885.         SYS    SetSignal
  886.         Move.L    #SIGBREAKB_CTRL_C,D1
  887.         BTst    D1,D0
  888.  
  889.         MoveM.L    (Sp)+,A0-A6
  890.         Rts
  891.  
  892. ;---------------------------------------------------------------
  893. ; PrintNText routine. Prints a NULL-terminated string to the standard output.
  894. ; Automatically appends a linefeed character to the end of the text output.
  895. ;
  896. ;   Input: D2 = Pointer to the NULL-terminated text string to print.
  897. ;
  898. ;  Output: Nothing.
  899. ;
  900. ; Trashes: D0,D1,D2,D3,A0,A1,A2
  901. ;
  902.  
  903. PrintNText    Bsr    PrintN2Text
  904.         Bne    .Done
  905.  
  906.         Move.L    #LineFeed,D2
  907.         MoveQ    #1,D3
  908.         Bsr    PrintCLI
  909.  
  910. .Done        Rts
  911.  
  912. LineFeed    Dc.B    LF,0
  913.  
  914. ;---------------------------------------------------------------
  915. ; PrintN2Text routine.  Prints a NULL-terminated string to the standard output,
  916. ; just like PrintNText above, but does not output a linefeed at the end.
  917. ;
  918. ;   Input: D2 = Pointer to the NULL-terminated text string to print.
  919. ;
  920. ;  Output: D0 = Nothing.
  921. ;
  922. ; Trashes: D0,D1,D2,D3,A0,A1,A2
  923. ;
  924.  
  925. PrintN2Text    MoveQ    #0,D3
  926.         Move.L    D2,A0
  927. .1        AddQ    #1,D3
  928.         Tst.B    (A0)+
  929.         Bne    .1
  930.         SubQ    #1,D3
  931.         Bsr    PrintCLI
  932.         Rts
  933.  
  934. ;---------------------------------------------------------------
  935. ; PrintTextMax routine.  Prints a NULL-terminated string to the standard output,
  936. ; just like PrintNText, but does not output a linefeed at the end.  Also takes
  937. ; a maximum number of characters as input.  The string output will not be longer
  938. ; than this number.
  939. ;
  940. ;   Input: D2 = Pointer to the NULL-terminated text string to print.
  941. ;
  942. ;  Output: D0 = Nothing.
  943. ;
  944. ; Trashes: D0,D1,D2,D3,A0,A1,A2
  945. ;
  946.  
  947. PrintTextMax    MoveQ    #0,D3
  948.         MoveQ    #0,D1
  949.         Move.W    D0,D1
  950.         SubQ.W    #1,D0
  951.         Move.L    D2,A0
  952. .1        AddQ    #1,D3
  953.         Tst.B    (A0)+
  954.         DBeq    D0,.1
  955.         SubQ    #1,D3
  956.         Cmp.W    D1,D3
  957.         Blt    .2
  958.         Move.L    D1,D3
  959. .2        Move.L    D3,-(Sp)
  960.         Bsr    PrintCLI
  961.         Move.L    (Sp)+,D3    ;Return number of characters printed.
  962.         Exg    D0,D3
  963.         BTst    D1,D3
  964.         Rts
  965.  
  966. ;---------------------------------------------------------------
  967. ; PrintNicely routine.  Prints a NULL-Terminated text string one line at a time
  968. ; (using the PrintCLI routine above) so that the output can be paused by
  969. ; pressing a key.  It is important to remember that the text string passed to
  970. ; this routine MUST have a linefeed character immediately preceding the 
  971. ; terminating NULL.
  972. ;
  973. ;   Input: D2 = Pointer to the text string to print (LF & NULL-terminated).
  974. ;
  975. ;  Output: Nothing.
  976. ;
  977. ; Trashes: D0,D1,D2,A0,A1
  978. ;
  979.  
  980. PrintNicely    MoveM.L    D3/A2/A3/A5,-(Sp)
  981.         Move.L    D2,A5
  982.  
  983. .NextLine    Move.L    A5,A3
  984.         MoveQ    #0,D3
  985. .CountChars    AddQ    #1,D3
  986.         Move.B    (A3)+,D0
  987.         Beq    .Done
  988.         Cmp.B    #LF,D0
  989.         Bne    .CountChars
  990.  
  991.         Move.L    A5,D2
  992.         Move.L    A3,A5
  993.         Bsr    PrintCLI
  994.         Bne    .AbortControlC
  995.  
  996.         Bra    .NextLine
  997.  
  998. .Done        MoveM.L    (Sp)+,D3/A2/A3/A5
  999.         Rts
  1000.  
  1001. .AbortControlC    MoveQ    #-1,D0
  1002.         Bra    .Done
  1003.  
  1004. ;---------------------------------------------------------------
  1005. ; BinToDec routine.  Converts an unsigned long into a decimal string
  1006. ; that can be printed.  The resultant string is NULL-Terminated.
  1007. ;
  1008. ;  Input: D0 = unsigned longword to convert.
  1009. ;
  1010. ; Output: DecString[] holds the decimal string of the value.
  1011. ;
  1012. BinToDec    MoveM.L    D0-D3/A0,-(Sp)
  1013.  
  1014.         MoveQ    #10-1,D1    ;Start with index for highest power of 10.
  1015.         Lea    DecString(A4),A0
  1016.  
  1017. .Loop        Move.L    D1,D2
  1018.         Add.L    D2,D2
  1019.         Add.L    D2,D2
  1020.         Move.L    PowerTable(PC,D2.W),D2    ;D2 holds current power of 10.
  1021.  
  1022.         MoveQ    #-1,D3
  1023. .1        AddQ.W    #1,D3
  1024.         Sub.L    D2,D0
  1025.         Bpl    .1
  1026.         Add.L    D2,D0
  1027.         Add.B    #"0",D3        ;D3 holds ASCII digit.
  1028.         Move.B    D3,(A0)+    ;Store digit in string.
  1029.  
  1030.         DBra    D1,.Loop
  1031.         Clr.B    (A0)
  1032.         MoveM.L    (Sp)+,D0-D3/A0
  1033.         Rts
  1034.  
  1035. PowerTable    Dc.L    1
  1036.         Dc.L    10
  1037.         Dc.L    100
  1038.         Dc.L    1000
  1039.         Dc.L    10000
  1040.         Dc.L    100000
  1041.         Dc.L    1000000
  1042.         Dc.L    10000000
  1043.         Dc.L    100000000
  1044.         Dc.L    1000000000
  1045.  
  1046. ;---------------------------------------------------------------
  1047. ; BinToTime routine.  Converts a longword number of ticks (units of
  1048. ; 1/60 second) into a string of the form "00:00:00:00"...
  1049. ;
  1050. ;  Input: D0.L = unsigned longword value to convert.
  1051. ;
  1052. ; Output: TimeString holds the time string of the value.
  1053. ;
  1054. BinToTime    MoveM.L    D2-D3/A2,-(Sp)
  1055.  
  1056.         Move.L    D0,D2
  1057.         Lea    TimeString(A4),A2
  1058.  
  1059. ; Calculate number of hours...
  1060.  
  1061.         Move.L    #216000,D1
  1062.         MoveQ    #0,D3
  1063.  
  1064. .HoursLoop    AddQ    #1,D3
  1065.         Sub.L    D1,D2
  1066.         Bpl    .HoursLoop
  1067.  
  1068.         Add.L    D1,D2
  1069.         SubQ    #1,D3
  1070.         Move.L    D3,D0
  1071.         Bsr    BinToDec
  1072.         Lea    DecString+8(A4),A0
  1073.         Move.B    (A0)+,(A2)+
  1074.         Move.B    (A0)+,(A2)+
  1075.         Move.B    #":",(A2)+
  1076.  
  1077. ; Calculate number of minutes...
  1078.  
  1079.         Move.L    #3600,D1
  1080.         MoveQ    #0,D3
  1081.  
  1082. .MinutesLoop    AddQ    #1,D3
  1083.         Sub.L    D1,D2
  1084.         Bpl    .MinutesLoop
  1085.  
  1086.         Add.L    D1,D2
  1087.         SubQ    #1,D3
  1088.         Move.L    D3,D0
  1089.         Bsr    BinToDec
  1090.         Lea    DecString+8(A4),A0
  1091.         Move.B    (A0)+,(A2)+
  1092.         Move.B    (A0)+,(A2)+
  1093.         Move.B    #":",(A2)+
  1094.  
  1095. ; Calculate number of seconds...
  1096.  
  1097.         MoveQ    #60,D1
  1098.         MoveQ    #0,D3
  1099.  
  1100. .SecondsLoop    AddQ    #1,D3
  1101.         Sub.L    D1,D2
  1102.         Bpl    .SecondsLoop
  1103.  
  1104.         Add.L    D1,D2
  1105.         SubQ    #1,D3
  1106.         Move.L    D3,D0
  1107.         Bsr    BinToDec
  1108.         Lea    DecString+8(A4),A0
  1109.         Move.B    (A0)+,(A2)+
  1110.         Move.B    (A0)+,(A2)+
  1111.         Move.B    #":",(A2)+
  1112.  
  1113. ; Calculate number of jiffies...
  1114.  
  1115.         Move.L    D2,D0
  1116.         Bsr    BinToDec
  1117.         Lea    DecString+8(A4),A0
  1118.         Move.B    (A0)+,(A2)+
  1119.         Move.B    (A0)+,(A2)+
  1120.         Clr.B    (A2)
  1121.  
  1122.         MoveM.L    (Sp)+,D2-D3/A2
  1123.         Rts
  1124.  
  1125.  
  1126. ;---------------------------------------------------------------
  1127. ; ReportLibErr routine.  Takes a library return code and turns it into
  1128. ; an error message that is displayed to the user.
  1129. ;
  1130. ;  Input: D0 = Library return code.
  1131. ;
  1132. ; Output: Nothing.
  1133.  
  1134. ReportLibErr    Tst.L    D0        ;Did an error actually occur?
  1135.         Bpl    .Done        ;Nope.
  1136.  
  1137.         Neg.W    D0        ;Make return code positive.
  1138.         SubQ    #1,D0        ;Code now in 0..n range.
  1139.         Add.W    D0,D0        ;Make longword index out of it.
  1140.         Add.W    D0,D0
  1141.         Lea    ErrorLookup,A0    ;Ptr to err msg addr lookup table.
  1142.         Move.L    0(A0,D0.W),D2    ;Get ptr to the error message.
  1143.         Bsr    PrintNicely    ;And print it.
  1144.  
  1145.         MoveQ    #-1,D0        ;Return general failure code.
  1146.  
  1147. .Done        Rts            ;That was easy.
  1148.  
  1149. ;==============================
  1150.  
  1151.         DATA
  1152.         Even
  1153.  
  1154. ; Lookup table for error message string addresses...
  1155.  
  1156. ErrorLookup    Dc.L    Owned
  1157.         Dc.L    DummyText
  1158.         Dc.L    DummyText
  1159.         Dc.L    DummyText
  1160.         Dc.L    DummyText
  1161.         Dc.L    LoadErr
  1162.         Dc.L    NoMem
  1163.         Dc.L    BadPath
  1164.         Dc.L    Format
  1165.         Dc.L    DummyText
  1166.         Dc.L    DummyText
  1167.         Dc.L    NotFoundErr
  1168.         Dc.L    MInstsErr
  1169.         Dc.L    DummyText
  1170.  
  1171. ; Error messages...
  1172.  
  1173. DummyText
  1174. Owned        Dc.B    LF,"ERROR: Library has been owned by another prog.",LF,LF,NULL
  1175. LoadErr        Dc.B    LF,"ERROR: Could not load file.",LF,LF,NULL
  1176. NoMem        Dc.B    LF,"ERROR: Insufficient memory.",LF,LF,NULL
  1177. BadPath        Dc.B    LF,"ERROR: Illegal pathname.",LF,LF,NULL
  1178. Format        Dc.B    LF,"ERROR: Unrecognized module format.",LF,LF,NULL
  1179. NotFoundErr    Dc.B    LF,"ERROR: File not found.",LF,LF,NULL
  1180. MInstsErr    Dc.B    LF,"ERROR: Module is missing instrument(s).",LF,LF,NULL
  1181.  
  1182. NoModuleText    Dc.B    LF,"ERROR: No module is currently loaded.",LF,LF,NULL
  1183. InsuffMemText    Dc.B    LF,"ERROR: Insufficient memory.",LF,LF,NULL
  1184. NotFileText    Dc.B    LF,"ERROR: filespec must specify a file, not a directory.",LF,LF,NULL
  1185. NoLibOpenText    Dc.B    LF,"ERROR: You need destracker.library v3.0 or higher.",LF,LF,NULL
  1186.  
  1187. ; Title, copyright, and usage text...
  1188.  
  1189. HelloText    Dc.B    LF,"destracker.library Module Info program",LF
  1190.         Dc.B    "Copyright (c)1993 by Darren Schebek",LF
  1191.         Dc.B    "Version 2.0  Dec 18, 1993",LF,LF
  1192.         Dc.B    "usage: modinfo {filespec}   Load mod & report stats",LF
  1193.         Dc.B    "       modinfo              Report on current mod",LF
  1194.         Dc.B    "       modinfo ?            Show usage",LF,LF
  1195.         Dc.B    NULL
  1196.  
  1197. ; Various text used for reporting statistics...
  1198.  
  1199. ModInfoForFile    Dc.B    LF,"Module information for file: ",NULL
  1200. TitleText    Dc.B    LF,"          Title: ",NULL
  1201. PTimeText    Dc.B    "mJuke Play Time: ",NULL
  1202. FLengthText    Dc.B    "   File  Length: ",NULL
  1203. FormatText    Dc.B    "         Format: ",NULL
  1204. HasPSC0Text    Dc.B    "       Has PSC0: ",NULL
  1205. BaseTimingText    Dc.B    "    Base Timing: ",NULL
  1206. TempoIntText    Dc.B    "   Tempo Interp: ",NULL
  1207. DefTempoText    Dc.B    "     Def. Tempo: ",NULL
  1208. DefFTempoText    Dc.B    "    Def. FTempo: ",NULL
  1209. IterationsText    Dc.B    "   # Iterations: ",NULL
  1210. NumPattsText    Dc.B    "     # Patterns: ",NULL
  1211. NumPosText    Dc.B    "    # Positions: ",NULL
  1212. NumInstsText    Dc.B    "  # Instruments: ",NULL
  1213. InstDataText    Dc.B    LF,"Instrument Data:",LF,LF
  1214.         Dc.B    "Number  Name                     Length  RepOffset  RepLen  Volume",NULL
  1215. UnusedText    Dc.B    "     *** Unused Instrument ***",LF,NULL
  1216.  
  1217. MinusText    Dc.B    "-"
  1218. DTFormat    Dc.B    "DES-Tracker v1.0",NULL
  1219. STFormat    Dc.B    "Soundtracker v2.6",NULL
  1220. NTFormat    Dc.B    "Noise/Protracker",NULL
  1221. YesText        Dc.B    "Yes",NULL
  1222. NoText        Dc.B    "No",NULL
  1223. NTSCText    Dc.B    "NTSC",NULL
  1224. PALText        Dc.B    "PAL",NULL
  1225. UnknownText    Dc.B    "Unknown",NULL
  1226. StandardText    Dc.B    "Standard",NULL
  1227. BPMText        Dc.B    '"Beats Per Minute"',NULL
  1228. InfiniteText    Dc.B    "Infinite",NULL
  1229.  
  1230. ; Library names used for OpenLibrary()...
  1231.  
  1232. DosName        Dc.B    "dos.library",0
  1233. DTLName        DTLIBNAME
  1234.  
  1235.         Even
  1236.         End
  1237.